# 函数的参数传递
# 又分为个数可变的位置参数和个数可变关键字参数两种
# 可变位置参数(*para):  其中个数可变的位置参数是在参数前加一颗星(*para),para形式参数的名称函数调用时可接收任意个数的实际参数，并放到一个元组中。
# 可变关键字参数 （**para）:个数可变的关键字参数是在参数前加两颗星（**para），字典接受

# 在函数调用时可接收任意多个，’参数=值‘形式的参数，并放到一个字典中。


######################################################## 可变位置参数(*para)，元组接受
def func1(*param):
    # 可变位置参数传递进来的所有数据会放到一个元素，所以这里的param是个元组。
    # 输出<class 'tuple'>
    print(type(param))
    print(param)
    for item in param:
        print(item)


# func1(1,2,3,4)
# func1(1,2)
# func1(1)
#
# # 实际上传递的事一个参数
# func1([10,20,30])
#
# # 在调用时，参数前加一颗*，将列表进行拆包
# func1(*['上海','北京','嘉兴'])


######################################################## 可变关键字参数(*para)，字典接受


def func2(**kvparam):
    # 可变关键字参数用字典接收
    # 输出<class 'dict'>
    print(type(kvparam))
    for key, value in kvparam.items():
        print('元素：', key, value)

func2(name='yinsc', age=18)

# 以下代码报错，输出如下：
# func2() takes 0 positional arguments but 1 was given
# 因为是关键字参数，但是给了位置参数
d={'name':'zhumeiqing','age':18}
# func2(d)


# 以下代码就可以运行，因为在参数前面加了**，对字典进行了解包操作，又转换为了关键字参数
func2(**d)